#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <pthread.h>

int a = 1;

void *t1_run(void *argv)
{
  a = a + 1;
  printf("t1_run: %d\n", a);
  while (1)
  {
    printf("线程1正在运行\n");
    sleep(1);
  }
}

void *t2_run(void *argv)
{
  a = a + 1;
  printf("t2_run: %d\n", a);
  while (1)
  {
    printf("线程2正在运行\n");
    sleep(1);
  }
}

void *t3_run(void *argv)
{
  a = a + 1;
  printf("t3_run: %d\n", a);
  while (1)
  {
    printf("线程3正在运行\n");
    sleep(1);
  }
}

int main()
{
  pthread_t t1, t2, t3;
  pthread_create(&t1, NULL, t1_run, NULL);
  pthread_create(&t2, NULL, t2_run, NULL);
  pthread_create(&t3, NULL, t3_run, NULL);

  while (1)
  {
    printf("主线程正在运行\n");
    sleep(1);
  }

  return 0;
}

// // SIGCHLD 信号
// pid_t pid = 0;

// void handler(int signo)
// {
//   // 将子进程回收
//   printf("当前 %d 收到 %d 号信号，回收僵尸进程 %d\n", getpid(), signo, pid);
//   sleep(5);
//   while(1)
//   {
//     pid_t ret = waitpid(-1, NULL, WNOHANG);
//     if(ret > 0)
//     {
//       printf("成功回收了进程 %d \n", ret);
//     }
//     else break;
//   }
//   printf("已经执行 handler 方法，回收了僵尸进程\n");
// }

// int main()
// {
//   signal(SIGCHLD, handler);

//   for (int i = 0; i < 10; i++)
//   {
//     pid = fork();

//     if (pid == 0)
//     {
//       int cnt = 1;
//       while (cnt <= 5)
//       {
//         printf("我是子进程，已经运行了 %d 秒，PID: %d PPID: %d\n", cnt, getpid(), getppid());
//         cnt++;
//         sleep(1);
//       }
//       exit(1);
//     }
//   }

//   while (1)
//   {
//     sleep(1);
//   }

//   return 0;
// }

// // volatile 关键字
// int quit = 0;
// // volatile int quit = 0;  //关闭编译器对此变量的寄存器级优化

// void handler(int signo)
// {
//   printf("收到来自 %d 的 %d 号信号\n", getpid(), signo);
//   quit = 1;
// }

// int main()
// {
//   signal(SIGINT, handler);

//   // 观察编译器的优化现象
//   while (!quit)
//   {
//     // printf("我正在跑\n");
//     // sleep(1);
//     ;
//   }

//   return 0;
// }
